package main

import (
	"fmt"
)

// 编写一个学生考试系统
type Student struct {
	Name  string
	Age   int
	Score int
}

// 将 Pupil 和 Graduate 共有的方法也绑定到 *Student
func (stu *Student) ShowInfo() {
	fmt.Printf("学生名=%v 年龄=%v 成绩=%v\n", stu.Name, stu.Age, stu.Score)
}
func (stu *Student) SetScore(score int) {
	// 业务判断
	stu.Score = score
}

// 给 *Student 增加一个方法，那么 Pupil 和 Graduate 都可以使用该方法
func (stu *Student) GetSum(n1 int, n2 int) int {
	return n1 + n2
}

// 小学生
type Pupil struct {
	Student // 嵌入了 Student 匿名结构体
}

// 显示他的成绩
// 这是 Pupil 结构体特有的方法
func (p *Pupil) testing() {
	fmt.Println("小学生正在考试中.....")
}

// 大学生
type Graduate struct {
	Student //嵌入了 Student 匿名结构体
}

// 显示他的成绩
// 这是 Graduate 结构体特有的方法
func (p *Graduate) testing() {
	fmt.Println("大学生正在考试中.....")
}

func main() {
	// 当我们对结构体嵌入了匿名结构体,使用方法会发生变化
	pupil := &Pupil{}
	pupil.Student.Name = "tom~"
	pupil.Student.Age = 8
	pupil.testing()
	pupil.Student.SetScore(70)
	pupil.Student.ShowInfo()
	fmt.Println("res=", pupil.Student.GetSum(1, 2))

	graduate := &Graduate{}
	graduate.Student.Name = "mary~"
	graduate.Student.Age = 28
	graduate.testing()
	graduate.Student.SetScore(90)
	graduate.Student.ShowInfo()
	fmt.Println("res=", graduate.Student.GetSum(10, 20))
}

/////////////////////////////////////////////////////////////////////////////////

//package main
//
//import (
//	"fmt"
//)
//
//// 编写一个学生考试系统
//// 小学生
//type Pupil struct {
//	Name  string
//	Age   int
//	Score int
//}
//
//// 显示他的成绩
//func (p *Pupil) ShowInfo() {
//	fmt.Printf("学生名=%v 年龄=%v 成绩=%v\n", p.Name, p.Age, p.Score)
//}
//func (p *Pupil) SetScore(score int) {
//	// 业务判断
//	p.Score = score
//}
//func (p *Pupil) testing() {
//	fmt.Println("小学生正在考试中.....")
//}
//
//// 大学生, 研究生
//// 大学生
//type Graduate struct {
//	Name  string
//	Age   int
//	Score int
//}
//
//// 显示他的成绩
//func (p *Graduate) ShowInfo() {
//	fmt.Printf("学生名=%v 年龄=%v 成绩=%v\n", p.Name, p.Age, p.Score)
//
//}
//func (p *Graduate) SetScore(score int) {
//	// 业务判断
//	p.Score = score
//}
//func (p *Graduate) testing() {
//	fmt.Println("大学生正在考试中.....")
//}
//
//// 代码冗余
//func main() {
//	var pupil = &Pupil{
//		Name: "tom",
//		Age:  10,
//	}
//	pupil.testing()
//	pupil.SetScore(90)
//	pupil.ShowInfo()
//
//	var graduate = &Graduate{
//		Name: "mary",
//		Age:  20,
//	}
//	graduate.testing()
//	graduate.SetScore(90)
//	graduate.ShowInfo()
//}
